package com.halfsword.creativecraft.event;

import com.halfsword.creativecraft.CreativeCraft;
import com.halfsword.creativecraft.block.BlockLoader;
import com.halfsword.creativecraft.entity.villager.Villagers;
import com.halfsword.creativecraft.item.ItemLoader;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.minecraft.world.entity.npc.VillagerProfession;
import net.minecraft.world.entity.npc.VillagerTrades;
import net.minecraft.world.item.EnchantedBookItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.enchantment.EnchantmentInstance;
import net.minecraft.world.item.enchantment.Enchantments;
import net.minecraft.world.item.trading.MerchantOffer;
import net.minecraftforge.event.village.VillagerTradesEvent;
import net.minecraftforge.event.village.WandererTradesEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

import java.util.List;

/**
 * 自定义交易事件处理器 - DeepSeek 提供核心注释
 *
 * <p>本类负责为模组添加自定义交易内容：</p>
 * <ul>
 *   <li>为村民添加模组特定物品的交易</li>
 *   <li>为流浪商人添加特殊交易</li>
 *   <li>平衡游戏内经济系统</li>
 * </ul>
 *
 * <p>设计原则：</p>
 * <ol>
 *   <li>保持与 Minecraft 原生交易系统的一致性</li>
 *   <li>根据村民等级提供不同价值的交易</li>
 *   <li>确保交易内容符合模组主题</li>
 * </ol>
 */
@Mod.EventBusSubscriber(modid = CreativeCraft.MOD_ID)
public class Events {

    /**
     * 村民交易事件处理器 - DeepSeek 注释
     *
     * <p>为不同职业的村民添加自定义交易项目：</p>
     * <ul>
     *   <li>农民：添加高粱及其种子的交易</li>
     *   <li>图书管理员：添加高级附魔书交易</li>
     * </ul>
     *
     * @param event 村民交易事件
     */
    @SubscribeEvent
    public static void addCustomTrades(VillagerTradesEvent event) {
        // 农民职业的交易添加
        if(event.getType() == VillagerProfession.FARMER) {
            Int2ObjectMap<List<VillagerTrades.ItemListing>> trades = event.getTrades();

            // 等级1 交易：20个绿宝石 → 1个高粱
            trades.get(1).add((trader, random) -> new MerchantOffer(
                    new ItemStack(Items.EMERALD, 20), // 支付物品
                    new ItemStack(ItemLoader.SORGHUM.get(), 1), // 得到物品
                    10, // 最大交易次数
                    8,  // 村民经验值
                    0.02f // 价格乘数
            ));

            // 等级2 交易：21个绿宝石 → 4个高粱（性价比更高）
            trades.get(2).add((trader, random) -> new MerchantOffer(
                    new ItemStack(Items.EMERALD, 21),
                    new ItemStack(ItemLoader.SORGHUM.get(), 4),
                    5,  // 减少交易次数以平衡
                    9,  // 更高经验值
                    0.035f
            ));

            // 等级3 交易：2个钻石 → 2个高粱种子
            trades.get(3).add((trader, random) -> new MerchantOffer(
                    new ItemStack(Items.DIAMOND, 2), // 使用高级货币
                    new ItemStack(ItemLoader.SORGHUM_SEEDS.get(), 2),
                    2,  // 稀有交易
                    12, // 高经验值
                    0.075f
            ));

            // 等级4 交易：10个金锭 → 2个高粱种子
            trades.get(4).add((trader, random) -> new MerchantOffer(
                    new ItemStack(Items.GOLD_INGOT, 10), // 替代货币
                    new ItemStack(ItemLoader.SORGHUM_SEEDS.get(), 2),
                    1,   // 非常稀有
                    15,  // 更高经验值
                    0.0105f
            ));

            // 等级5 交易：2个钻石块 → 1个金盏花
            trades.get(5).add((trader, random) -> new MerchantOffer(
                    new ItemStack(Items.DIAMOND_BLOCK, 2), // 高级货币
                    new ItemStack(BlockLoader.CALENDULA.get(), 1), // 装饰性植物
                    1,   // 唯一交易
                    20,  // 最高经验值
                    0.0205f
            ));
        }

        // 图书管理员职业的交易添加
        if(event.getType() == VillagerProfession.LIBRARIAN) {
            Int2ObjectMap<List<VillagerTrades.ItemListing>> trades = event.getTrades();

            // 创建V级锋利附魔书
            ItemStack enchantBook1 = EnchantedBookItem.createForEnchantment(
                    new EnchantmentInstance(Enchantments.SHARPNESS, 5)
            );

            // 等级5 交易：72个绿宝石块 → V级锋利附魔书
            trades.get(5).add((trader, random) -> new MerchantOffer(
                    new ItemStack(Items.EMERALD_BLOCK, 72), // 极高成本
                    enchantBook1, // 顶级附魔
                    1,   // 唯一交易
                    8,   // 经验值（相对较低，因为成本已很高）
                    0.002f // 极小的价格浮动
            ));
        }
        // 在addCustomTrades方法中添加以下代码块
        if(event.getType() == Villagers.MUSICIAN.get()) {
            Int2ObjectMap<List<VillagerTrades.ItemListing>> trades = event.getTrades();

            // 等级1 交易 - 基础音乐物品
            trades.get(1).add((trader, random) -> new MerchantOffer(
                    new ItemStack(Items.EMERALD, 3),  // 成本：3 绿宝石
                    new ItemStack(Items.BELL, 1),     // 获得：1 个铃铛
                    12,  // 最大交易次数
                    2,   // 村民经验值
                    0.05f
            ));

            trades.get(1).add((trader, random) -> new MerchantOffer(
                    new ItemStack(Items.EMERALD, 1),
                    new ItemStack(Items.NOTE_BLOCK, 1),
                    16, 8, 0.02f
            ));

            // 等级2 交易 - 基础唱片
            trades.get(2).add((trader, random) -> new MerchantOffer(
                    new ItemStack(Items.EMERALD, 7),
                    new ItemStack(Items.MUSIC_DISC_13, 1),
                    8, 10, 0.1f
            ));

            trades.get(2).add((trader, random) -> new MerchantOffer(
                    new ItemStack(Items.EMERALD, 7),
                    new ItemStack(Items.MUSIC_DISC_CAT, 1),
                    8, 10, 0.1f
            ));

            // 等级3 交易 - 中级唱片及乐器
            trades.get(3).add((trader, random) -> new MerchantOffer(
                    new ItemStack(Items.EMERALD, 12),
                    new ItemStack(Items.MUSIC_DISC_BLOCKS, 1),
                    6, 20, 0.15f
            ));

            trades.get(3).add((trader, random) -> new MerchantOffer(
                    new ItemStack(Items.IRON_INGOT, 4),  // 替代货币
                    new ItemStack(Items.JUKEBOX, 1),     // 获得唱片机
                    4, 15, 0.08f
            ));

            // 等级4 交易 - 稀有唱片
            trades.get(4).add((trader, random) -> new MerchantOffer(
                    new ItemStack(Items.EMERALD, 18),
                    new ItemStack(Items.MUSIC_DISC_MELLOHI, 1),
                    3, 30, 0.2f
            ));

            trades.get(4).add((trader, random) -> new MerchantOffer(
                    new ItemStack(Items.GOLD_INGOT, 3),  // 高级货币
                    new ItemStack(Items.MUSIC_DISC_STAL, 1),
                    3, 25, 0.15f
            ));

            // 等级5 交易 - 顶级稀有唱片
            trades.get(5).add((trader, random) -> new MerchantOffer(
                    new ItemStack(Items.EMERALD_BLOCK, 2),  // 2个绿宝石块（18 绿宝石）
                    new ItemStack(Items.MUSIC_DISC_11, 1),  // 稀有唱片
                    2, 40, 0.25f
            ));

            trades.get(5).add((trader, random) -> new MerchantOffer(
                    new ItemStack(Items.DIAMOND, 4),       // 高级货币
                    new ItemStack(Items.MUSIC_DISC_WAIT, 1), // 最稀有唱片
                    1, 50, 0.01f  // 极小价格浮动保证稀有度
            ));
            trades.get(5).add((trader, random) -> new MerchantOffer(
                    new ItemStack(Items.DIAMOND_BLOCK, 4),       // 最高等级
                    new ItemStack(ItemLoader.CORNFIELD_CHASE_DISC.get(), 1), // 最稀有唱片()
                    1, 50, 0.01f  // 极小价格浮动保证稀有度
            ));
        }
    }

    /**
     * 流浪商人交易事件处理器 - DeepSeek 注释
     *
     * <p>为流浪商人添加特殊交易：</p>
     * <ul>
     *   <li>普通交易：绿宝石换钻石</li>
     *   <li>稀有交易：绿宝石块换钻石块</li>
     * </ul>
     *
     * @param event 流浪商人交易事件
     */
    @SubscribeEvent
    public static void addCustomWanderingTrades(WandererTradesEvent event) {
        List<VillagerTrades.ItemListing> genericTrades = event.getGenericTrades();
        List<VillagerTrades.ItemListing> rareTrades = event.getRareTrades();

        // 普通交易：12个绿宝石 → 1个钻石（基础货币转换）
        genericTrades.add((trader, random) -> new MerchantOffer(
                new ItemStack(Items.EMERALD, 12), // 支付
                new ItemStack(Items.DIAMOND, 1),  // 得到
                10, // 较多次数
                2,  // 低经验
                0.2f // 中等价格浮动
        ));

        // 稀有交易：5个绿宝石块 → 2个钻石块（高级货币转换）
        rareTrades.add((trader, random) -> new MerchantOffer(
                new ItemStack(Items.EMERALD_BLOCK, 5), // 高级支付
                new ItemStack(Items.DIAMOND_BLOCK, 2), // 高级得到
                2,   // 较少次数
                12,  // 较高经验
                0.15f // 价格浮动
        ));
    }
}